package com.jiankangjin.weixinchannel.services.impl;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.jiankangjin.httpclient.HttpClient;
import com.jiankangjin.weixinchannel.vo.QueryVo;

/**
 * 由于微信扫码付没有异步通知（当用户需要输入密码完成支付时）
 * 根据文档《微信被扫支付接口文档V2.5.5》：
 * 当调用扣款接口返回支付中或失败状态，需要调用查询接口查询订单实际支付状态。
 * 当遇到用户超过日限额需要输入密码返回“支付中”的状态，建议 10 秒调一次查询，调用 3 次后还未成功作支付超时处理
 * 
 * 本类的功能实现为：
 * 当支付中时，起一个进程；
 * 10秒调用一个查询；
 * 10秒内返回支付成功，那么通知交易系统；10秒后返回没支付，直接结束；
 */
public class GetPayStateThread extends Thread {
	private static final transient Log logger = LogFactory.getLog(GetPayStateThread.class);
	
	private String out_trade_no;
	private String pay_chnl_seq;
	
	@Override
	public void run() {
		logger.info("线程已启动 " + out_trade_no);
		QueryVo queryVo = new QueryVo();
		try {
			Thread.sleep(3000);
			logger.info("第一次查 " + out_trade_no);
			queryVo = getPayState();
			if ("1001".equals(queryVo.getSub_deal_status())) {
				notifyTransSystem(queryVo);
				return;
			} else {
				Thread.sleep(10000);
				logger.info("第二次查 " + out_trade_no);
				queryVo = getPayState();
				if ("1001".equals(getPayState().getSub_deal_status())) {
					notifyTransSystem(queryVo);
					return;
				} else {
					Thread.sleep(10000);
					logger.info("第三次查 " + out_trade_no);
					queryVo = getPayState();
					if ("1001".equals(getPayState().getSub_deal_status())) {
						notifyTransSystem(queryVo);
						return;
					}
				}
			}
		} catch (Exception e) {
			logger.error(out_trade_no + " 线程异常报错");
			e.printStackTrace();
		}
	}
	
	
	private QueryVo getPayState() {
		return new QueryServiceImpl().barcode_V0_0_1(
				out_trade_no, null, 
				pay_chnl_seq, null);
	}
	
	private void notifyTransSystem(QueryVo queryVo) {
		logger.info(out_trade_no + " 用户已支付。");
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("notify_type", "pay_sync");
		params.put("out_trade_no", out_trade_no);
		params.put("order_id", "");
		params.put("pay_cry", "156");
		params.put("pay_amt", queryVo.getPay_amt());
		params.put("pay_chnl_seq", queryVo.getPay_chnl_seq());
		params.put("pay_fin_time", queryVo.getPay_fin_time());
		params.put("Pay_chnl_pos", "");
		params.put("Pay_chnl_mer", "");
		params.put("Pay_chnl_fee", "");
		params.put("pay_user", queryVo.getPay_user());
		params.put("sub_deal_status", queryVo.getSub_deal_status());
		params.put("sub_deal_msg", queryVo.getSub_deal_msg());
		Map<String, Object> returnMap = HttpClient.getInstance().doPOSTgetHashMap("/transSystem/channel_notify", params);
		if (returnMap != null && "0000".equals(returnMap.get("resp_status"))) {
			logger.info(out_trade_no + " 线程中通知成功");
		} else {
			logger.info(out_trade_no + " 线程中通知失败");
		}
	}
	
	public GetPayStateThread(String out_trade_no, String pay_chnl_seq) {
		this.out_trade_no = out_trade_no;
		this.pay_chnl_seq = pay_chnl_seq;
	}
	
	/**  */
	public String getOut_trade_no() {
		return out_trade_no;
	}
	/**  */
	public void setOut_trade_no(String out_trade_no) {
		this.out_trade_no = out_trade_no;
	}
	/**  */
	public String getPay_chnl_seq() {
		return pay_chnl_seq;
	}
	/**  */
	public void setPay_chnl_seq(String pay_chnl_seq) {
		this.pay_chnl_seq = pay_chnl_seq;
	}
}
